﻿#region Librerias

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls;
using System.Data;
using ESF.General;

#endregion


namespace ESF.Web
{
	public static class TreeLoader
	{
		#region Carga de arbol

		public static void Clear (TreeView pTree)
		{
			pTree.Nodes.Clear ();
			pTree.DataBind ();
			pTree.Visible = false;
		}
		

		public static bool Load (TreeView pTree, DataSet pdtsSet)
		{
			return Load (pTree, DataHelper.GetFirstDataTable (pdtsSet));
		}


		public static bool Load (TreeView pTree, DataTable pTable)
		{
			if (DataHelper.IsEmpty (pTable)) { Clear (pTree); return false; }

			return Load (pTree, pTable,
				pTable.Columns [0].ColumnName, pTable.Columns [1].ColumnName, pTable.Columns [2].ColumnName,
				pTable.Columns [3].ColumnName, pTable.Columns [4].ColumnName, false);
		}


		public static bool Load (TreeView pTree, DataTable pTable,
			string pstrCampoCodMenu, string pstrCampoNombre, string pstrCampoDescripcion,
			string pstrCampoCodMenuPadre, string pstrCampoUrl, bool pblnIncluirPadre)
		{
			DataRow [] dtrMainNodes;

			TreeNode treNodo;

			int intI;


			Clear (pTree);

			if (DataHelper.IsEmpty (pTable)) { return false; }

			// Se buscan las hojas principales
			dtrMainNodes = pTable.Select (string.Format ("{0} IS NULL", pstrCampoCodMenuPadre));

			if (dtrMainNodes.Length == 0) { return false; }

			foreach (DataRow dtrNivel in dtrMainNodes)
			{
				treNodo = new TreeNode (dtrNivel [pstrCampoNombre].ToString (), dtrNivel [pstrCampoCodMenu].ToString (), string.Empty, dtrNivel [pstrCampoUrl].ToString (), string.Empty);
                if(!(dtrNivel[pstrCampoDescripcion] is DBNull)) {
                    treNodo.ToolTip = dtrNivel[pstrCampoDescripcion].ToString();
                }
                else {
                    treNodo.ToolTip = dtrNivel[pstrCampoNombre].ToString();
                }

				CargarNivelArbol (treNodo, ref pTable, pstrCampoCodMenu, pstrCampoNombre, pstrCampoDescripcion, pstrCampoCodMenuPadre, pstrCampoUrl);

				if (pblnIncluirPadre)
				{
					pTree.Nodes.Add (treNodo);
					treNodo.ExpandAll ();
				}
				else
				{
					intI = treNodo.ChildNodes.Count;
					while (intI > 0)
					{
						pTree.Nodes.Add (treNodo.ChildNodes [0]);
						intI--;
					}
				}
			}

			pTree.Visible = true;

			return true;
		}


		private static void CargarNivelArbol (TreeNode ptreNodo, ref DataTable pTable,
			string pstrCampoCodMenu, string pstrCampoNombre, string pstrCampoDescripcion,
			string pstrCampoCodMenuPadre, string pstrCampoUrl)
		{
			DataRow [] dtrNodosHijo;

			TreeNode treNodo;


			dtrNodosHijo = pTable.Select (string.Format ("{0} = {1}", pstrCampoCodMenuPadre, ptreNodo.Value));

			foreach (DataRow dtrNivel in dtrNodosHijo)
			{
				treNodo = new TreeNode (dtrNivel [pstrCampoNombre].ToString (), dtrNivel [pstrCampoCodMenu].ToString (), string.Empty, dtrNivel [pstrCampoUrl].ToString (), string.Empty);
                if(!(dtrNivel[pstrCampoDescripcion] is DBNull)) {
                    treNodo.ToolTip = dtrNivel[pstrCampoDescripcion].ToString();
                }
                else {
                    treNodo.ToolTip = dtrNivel[pstrCampoNombre].ToString();
                }
				CargarNivelArbol (treNodo, ref pTable, pstrCampoCodMenu, pstrCampoNombre, pstrCampoDescripcion, pstrCampoCodMenuPadre, pstrCampoUrl);

				ptreNodo.ChildNodes.Add (treNodo);
			}
		}

		#endregion
	}
}
